package JDBC;

import java.sql.*;

public class Test04 {
    public static void main(String[] args) {
        // 数据库连接对象
        Connection conn = null;
        // sql 语句执行对象
        Statement stmt = null;
        // 查询结果集对象
        ResultSet rs = null;
        try {
            // 1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 建立数据库连接
            String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true";
            String username = "root";
            String password = "991025";
            conn = DriverManager.getConnection(url, username, password);
            // 3. 建立数据库操作对象
            stmt = conn.createStatement();
            // 4. 执行 sql 语句
            String sql = "select * from user";
            // int executeUpdate(insert/delete/update) 专门执行增删改的方法, 返回结果为变化的行数int
            // ResultSet executeQuery(select) 专门执行查询语句的方法, 返回结果集对象
            // ResultSet 的结构就像一个一维数组, 每一行就是一个结果(元组)
            // 5. 处理查询结果集
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                // 说明光标指向的行有数据
                // 取数据 使用 getString(int 下标/ String 列名)
                // 该方法的特点是: 不管数据库中有什么类型, 它的返回值都是 String
                // 参数为 int 时, 代表列下标(这里是列下标), JDBC 中的所有下标从 1 开始
                // 参数为 String 时, 代表列名(查询结果集中的列名), 如果将列名更名, 传入的参数列名必须为 重命名 之后的名字
                // 比如 user 表 index = 1 为 id, 2 为 name, 3 为 password

                // 下面的写法为根据下标获取元素
//                String id = rs.getString(1);
//                String name = rs.getString(2);
//                String pw = rs.getString(3);
                // getString 为获取一个String类型的
                // getInt 为获取int类型的
                // get类型 为获取什么类型的

                // 下面是以查询结果集的列名获取元素
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String pw = rs.getString("password");
                System.out.println(id + "," + name + "," + pw);
            }
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 6. 释放资源
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

    }
}
